package com.wengu.rabbitmq.work;

import com.rabbitmq.client.*;
import com.wengu.rabbitmq.util.ConnectionUtil;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

//simple消息模型的消费者
//了解
public class Recv2 {
    public static void main(String[] args) throws Exception {
        //1、获取连接
        Connection connection = ConnectionUtil.getConnection();
        //2、创建通道
        Channel channel = connection.createChannel();
        //3、通过通道定义要连接的队列
        channel.queueDeclare(Send.QUEUE_NAME , false , false , false , null);
        //声明当前消费者一次只能消费一条消息:当本次消费确认后mq的服务再发送下一条消息给当前消费者
        channel.basicQos(1);
        //4、监听队列
        //参数1：队列名称，参数2：消息接收到之后是否要自动确认，参数3：监听队列消息的回调对象(消息消费者对象)
        Consumer callback = new DefaultConsumer(channel){
            //参数：Envelope信封(消息的描述信息)，body获取到的消息内容
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //5、如果队列中有数据则消费使用的回调方法
                System.out.println("[ RECV2 ] 接收到消息：" + new String(body));
                System.out.println("当前接收消息的唯一标志："+ envelope.getDeliveryTag());
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //autoAck配置的为true，当前handleDelivery方法只要被调用，channel会自动向mq发送一个消息消费确认，mq服务端会将该消息删除
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        //阻塞：循环监听指定的消息队列
        channel.basicConsume(Send.QUEUE_NAME,false , callback);
    }
}